Garbage collection reclaims storage memory in a storage system, by relocating live data and erasing memory locations that have obsoleted or dead data. In solid state storages, the erasing is usually done in blocks, with the live data moved out of the blocks. Often, garbage collection is performed as a background task, but it still consumes processor time and storage system resources. Data compression can free up storage memory, as compressed data takes less space. Data compression can be performed as a foreground task, as part of data writing, or a background task, to compact long-term or even short-term data. But data compression, likewise, consumes processor time and storage system resources. Both garbage collection and data compression processes are processor intensive, and can hurt front-end write performance. In some systems, garbage collection can compete with data compression for system resources, and one can slow the other down. Therefore, there is a need in the art for a storage system solution which overcomes the drawbacks described above.